home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / Voyeur 1.1.1 / Voyeur ƒ / v code ƒ / v progress.c < prev    next >
Text File  |  1994-02-26  |  5KB  |  214 lines

  1. /**********************************************************************\
  2.  
  3. File:        v progress.c
  4.  
  5. Purpose:    This module handles the progress bar and dealing with
  6.             events while the progress bar is up.
  7.             
  8.  
  9.  
  10. Voyeur -- a no-frills file viewer
  11. Copyright ©1993-4, Mark Pilgrim
  12.  
  13. This program is free software; you can redistribute it and/or modify
  14. it under the terms of the GNU General Public License as published by
  15. the Free Software Foundation; either version 2 of the License, or
  16. (at your option) any later version.
  17.  
  18. This program is distributed in the hope that it will be useful,
  19. but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. GNU General Public License for more details.
  22.  
  23. You should have received a copy of the GNU General Public License
  24. along with this program in a file named "GNU General Public License".
  25. If not, write to the Free Software Foundation, 675 Mass Ave,
  26. Cambridge, MA 02139, USA.
  27.  
  28. \**********************************************************************/
  29.  
  30. #include "Power.h"
  31. #include "program globals.h"
  32. #include "v progress.h"
  33. #include "msg dialogs.h"
  34. #include "msg environment.h"
  35. #include "msg menus.h"
  36. #include "msg main.h"
  37.  
  38. enum
  39. {
  40.     progressDialogID = 210,
  41.     progressText = 1,
  42.     progressBar = 2
  43. };
  44.  
  45. DialogPtr        gProgressDlog;
  46.  
  47. static    Rect            box;
  48. static    unsigned long    curProgress;
  49. static    unsigned long    maxProgress;
  50.  
  51. static pascal void DrawProgressBar(WindowPtr theWindow, int item);
  52.  
  53. static pascal void DrawProgressBar(WindowPtr theWindow, int item)
  54. {
  55.     Rect                tempBox;
  56.     unsigned long        length;
  57.     unsigned long        width;
  58.     long double            temp;
  59.     
  60.     SetPort(theWindow);
  61.     
  62.     FrameRect(&box);
  63.     
  64.     length = box.right - box.left;
  65.     
  66.     width = length * curProgress;
  67.     if((width / length) != curProgress) {
  68.         temp = ((long double)curProgress) / ((long double)maxProgress);
  69.         width = temp * length;
  70.     } else {
  71.         width /= maxProgress;
  72.     }
  73.     
  74.     tempBox = box;
  75.     InsetRect(&tempBox, 1, 1);
  76.     tempBox.left += width;
  77.     FillRect(&tempBox, ltGray);
  78.     
  79.     tempBox = box;
  80.     InsetRect(&tempBox, 1, 1);
  81.     tempBox.right = tempBox.left + width - 1;
  82.     ForeColor(cyanColor);
  83.     PaintRect(&tempBox);
  84.     ForeColor(blackColor);
  85. }
  86.  
  87. DialogPtr OpenProgressDialog(unsigned long max, Str255 theTitle)
  88. {
  89.     int                itemType;
  90.     Handle            itemH;
  91.     Rect            otherBox;
  92.     
  93.     PositionDialog('DLOG', progressDialogID);
  94.     gProgressDlog = GetNewDialog(progressDialogID, 0L, (WindowPtr)-1L);
  95.     if(gProgressDlog == 0L)
  96.         return 0L;
  97.     
  98.     GetDItem(gProgressDlog, progressBar, &itemType, &itemH, &box);
  99.     SetDItem(gProgressDlog, progressBar, userItem + itemDisable, DrawProgressBar, &box);
  100.     
  101.     curProgress = 0;
  102.     maxProgress = max;
  103.     
  104.     SetWTitle((WindowPtr)gProgressDlog, theTitle);
  105.     
  106.     ShowWindow(gProgressDlog);
  107.     DrawDialog(gProgressDlog);
  108.     
  109.     UpdateProgressDialog(0);
  110.     
  111.     gInProgress=TRUE;
  112.     AdjustMenus();
  113.     DrawMenuBar();
  114.     
  115.     return gProgressDlog;
  116. }
  117.  
  118. void SetProgressText(Str255 p1, Str255 p2, Str255 p3, Str255 p4)
  119. {
  120.     Str255            totalStr;
  121.     unsigned char    i;
  122.     int                itemType;
  123.     Handle            itemH;
  124.     Rect            otherBox;
  125.     
  126.     totalStr[0]=0x00;
  127.     for (i=1; i<=p1[0]; i++)
  128.         totalStr[++totalStr[0]]=p1[i];
  129.     for (i=1; i<=p2[0]; i++)
  130.         totalStr[++totalStr[0]]=p2[i];
  131.     for (i=1; i<=p3[0]; i++)
  132.         totalStr[++totalStr[0]]=p3[i];
  133.     for (i=1; i<=p4[0]; i++)
  134.         totalStr[++totalStr[0]]=p4[i];
  135.     GetDItem(gProgressDlog, 1, &itemType, &itemH, &otherBox);
  136.     SetIText((ControlHandle)itemH, totalStr);
  137. }
  138.  
  139. void UpdateProgressDialog(unsigned long cur)
  140. {
  141.     curProgress = cur;
  142.     if(curProgress >= maxProgress)
  143.         curProgress = maxProgress-1;
  144.     
  145.     SetPort(gProgressDlog);
  146.     
  147.     DrawProgressBar(gProgressDlog, progressBar);
  148.     
  149.     if (gHasPowerManager)
  150.         IdleUpdate();
  151. }
  152.  
  153. void DismissProgressDialog(void)
  154. {
  155.     if (gProgressDlog!=0L)
  156.         DisposDialog(gProgressDlog);
  157.     gProgressDlog=0L;
  158.     gInProgress=FALSE;
  159.     AdjustMenus();
  160.     DrawMenuBar();
  161. }
  162.  
  163. #define TheCancelKey    '.'
  164.  
  165. Boolean DealWithOtherPeople(void)
  166. {
  167.     /* this is just a small useful function to see if the user has cancelled */
  168.     /* a lengthy operation with command-period; could come in handy, I suppose, */
  169.     /* in a somewhat bizarre set of circumstances... */
  170.     /* Note that this procedure will break under AUX */
  171.     /* Note also that this returns TRUE if there has been no attempt to cancel */
  172.     
  173.     Boolean            foundEvent;
  174.     EvQElPtr        eventQPtr;
  175.     QHdrPtr            eventQHdr;
  176.     char            thisChar;
  177.     long            isCmdKey;
  178.     EventRecord        event;
  179.     Boolean            notDoneYet;
  180.     
  181.     SetCursor(&arrow);
  182.     HiliteMenu(0);
  183.  
  184.     foundEvent=FALSE;
  185.     eventQHdr=GetEvQHdr();
  186.     eventQPtr=(EvQElPtr)(eventQHdr->qHead);
  187.     while ((eventQPtr!=0L) && (!foundEvent))
  188.     {
  189.         if (eventQPtr->evtQWhat==keyDown)
  190.         {
  191.             thisChar=(char)((eventQPtr->evtQMessage)&charCodeMask);
  192.             isCmdKey=(eventQPtr->evtQModifiers)&cmdKey;
  193.             if (isCmdKey!=0L)
  194.                 foundEvent=(thisChar==TheCancelKey);
  195.         }
  196.         if (!foundEvent)
  197.             eventQPtr=(EvQElPtr)(eventQPtr->qLink);
  198.     }
  199.     
  200.     notDoneYet=TRUE;
  201.     do
  202.     {
  203.         if (WaitNextEvent(everyEvent, &event, gIsInBackground ? 100 : 0, 0L))
  204.             DispatchEvents(event);
  205.         else
  206.             notDoneYet=FALSE;
  207.         if (event.what==nullEvent)
  208.             notDoneYet=FALSE;
  209.     }
  210.     while (notDoneYet);
  211.     
  212.     return !foundEvent;
  213. }
  214.